package com.feilong.edgeAI.speech.online;

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;

import com.feilong.edgeAI.speech.util.JsonParser;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;

/**
 * Created by【仿脑科技】
 *
 * @Author: potato
 * @CreateDate: 2023/11/22 10:14
 */
public class AsrHelper {
    private static final String TAG = "AsrHelper";
    // 语音听写对象
    private SpeechRecognizer mIat;
    private Context context;
    public AsrHelper(Context context){
        this.context = context;
        setParam();
    }
    public void start() {
        Log.d(TAG, "start: ");
        mIat.startListening(mRecognizerListener);
    }
    public void stop() {
        mIat.stopListening();
    }
    private String oldResult;
    /**
     * 识别监听器。
     */
    private RecognizerListener mRecognizerListener = new RecognizerListener() {

        @Override
        public void onVolumeChanged(int volume, byte[] data) {
            Log.d(TAG, "onVolumeChanged: "+volume);
        }

        @Override
        public void onBeginOfSpeech() {
            Log.d(TAG, "onBeginOfSpeech: ");
        }

        @Override
        public void onEndOfSpeech() {
            Log.d(TAG, "onEndOfSpeech: ");
            if(null!=asrHelperListener){
                asrHelperListener.onEndOfSpeech();
            }
        }

        @Override
        public void onResult(final RecognizerResult result, boolean isLast) {
//            Log.d(TAG, "onResult: "+result.getResultString());
            if (null != result && !TextUtils.isEmpty(result.getResultString())) {
                oldResult = JsonParser.parseIatResult(result.getResultString());
                Log.d(TAG, "recognizer result：" + oldResult);
                if(null!=asrHelperListener){
                    asrHelperListener.onAsrFinish(oldResult);
                }
//                playerUtils.play();
            } else {
                Log.d(TAG, "recognizer result : null");
            }
        }

        @Override
        public void onError(SpeechError error) {
            Log.d(TAG, "onError: " + error.getErrorDescription() + "  errorCode=" + error.getErrorCode());
//            showTip("onError Code：" + error.getErrorCode());
            if(null!=asrHelperListener){
                asrHelperListener.onEndOfSpeech();
            }
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            // 以下代码用于获取与云端的会话id，当业务出错时将会话id提供给技术支持人员，可用于查询会话日志，定位出错原因
            // 若使用本地能力，会话id为null
            //	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
            //		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            //		Log.d(TAG, "session id =" + sid);
            //	}
        }
    };
    /**
     * 参数设置
     *
     * @return
     */
    public void setParam() {
        mIat = SpeechRecognizer.createRecognizer(context, mInitListener);
        // 清空参数
        mIat.setParameter(SpeechConstant.PARAMS, null);
        // 设置引擎
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud");
        // 设置返回结果格式
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

        //mIat.setParameter(MscKeys.REQUEST_AUDIO_URL,"true");

        //	this.mTranslateEnable = mSharedPreferences.getBoolean( this.getString(R.string.pref_key_translate), false );
//        if (mEngineType.equals(SpeechConstant.TYPE_LOCAL)) {
//            // 设置本地识别资源
//            mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
//        }
        // 在线听写支持多种小语种，若想了解请下载在线听写能力，参看其speechDemo
//        if (lag.equals("en_us")) {
//            // 设置语言
//            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "en_us");
//            mIat.setParameter(SpeechConstant.ACCENT, null);
//
            // 设置语言
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mIat.setParameter(SpeechConstant.ACCENT, "lmz");
//            mIat.setParameter(SpeechConstant.ACCENT, "cantonese");
//        }
//        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");

        // 设置语音前端点:静音超时时间，即用户多长时间不说话则当做超时处理
//        mIat.setParameter(SpeechConstant.VAD_BOS, "1000");
//
//        // 设置语音后端点:后端点静音检测时间，即用户停止说话多长时间内即认为不再输入， 自动停止录音
//        mIat.setParameter(SpeechConstant.VAD_EOS, "500");

        // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "0");

        // 设置音频保存路径，保存音频格式支持pcm、wav，设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
//        mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
//        mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
//                getExternalFilesDir("msc").getAbsolutePath() + "/iat.wav");
        mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
//        mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, getWavFilePath());
    }


    /**
     * 初始化监听器。
     */
    private InitListener mInitListener = new InitListener() {

        @Override
        public void onInit(int code) {
            Log.d(TAG, "SpeechRecognizer init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
//                showTip("初始化失败,错误码：" + code);
            }
        }
    };
    private AsrHelperListener asrHelperListener;

    public void setAsrHelperListener(AsrHelperListener asrHelperListener) {
        this.asrHelperListener = asrHelperListener;
    }

    public interface AsrHelperListener{
        void onAsrFinish(String result);
        void onEndOfSpeech();
    }
}
